/* 
 * File:   InterpolacionAproximacion.h
 * Author: ginancm
 *
 * Created on 18 de septiembre de 2011, 10:32 PM
 */

#ifndef INTERPOLACIONAPROXIMACION_H
#define	INTERPOLACIONAPROXIMACION_H

#include "librerias/ReaderLabs.h"
#include "librerias/Polinomio.h"
#include "librerias/tnt_126/tnt_array2d.h"
#include <vector>

using namespace std;


class InterpolacionAproximacion : public ReaderLabs {
    
    private:
        int tam_entrada; //Numero de lineas a leer
        int tam_aleatorios; //Numero de datos aleatorios para la interpolación
        int ano; //Año a analizar.
        int tam_ajusteRandom; //De que tamaño serán ajustados los datos aleatorios
        int tam_ajuste; // Tamaño de datos a usar para ajustar el polinomio
        int gradPolyAprox;//grado del polinoimio de aproximacion
        long double errorAproximacion; //Contendrá el error calculad
        long double bondadAproximacn;//Contendrá la bondad del polinomio de aproximación
        double * array_datosX; //Valores de X leidos del archivo
        double * array_datosY; //Valores de Y leidos del archivo
        double * array_xRandom; //Valores de X generados aleatoriamente
        double * array_fdrand; //Valores de Y resultantes de la evaluación de la función
        double * array_xSelect;//Valores seleccionados para la interpolación
        double * array_ySelect;//Valores seleccionados para la interpolación.
        long double * array_interpOtro; //Valores obtenidos por la interpolación Lagrange
        long double * array_interpAprox; ////Valores obtenidos por la interpolación Aproximación
        long double * array_errorOtro;////Valores de error por la interpolación Newton
        TNT::Array1D<long double> array_coefAprox; //Coeficientes a_i, del vector X en el sistema de ecuaciones Ax=b
        TNT::Array2D<long double> mat_sumatorias;//Matriz A, sumatorias para solucion de sistema de ecuaciones
        TNT::Array1D<long double> vect_b;//Vector b, con el cual se solucionara Ax=b
        vector <long double> vectSumas, vectsumasB;
        Polinomio obj_polyComp, obj_polyAprox; //Polinomios De lagrange y Newton Obtenidos
        Polinomio obj_polyErrorComp; //Polinomios De error Lagrange o Newton Obtenidos
        bool * flags; //Flags para indicar si un dato fue seleccionado
        char * tipoPoly;
        char punto ;//Si es A o B
        long double errorAproxDatsPrueb;
        long double bondadAproxDatsPrueb;
        
       
    
    public:
        InterpolacionAproximacion(int anoSelect, int tamFileIn, int tamInterpol, const char* polyInterp, int tamAleatorios, int ajusteAleatorio) ;
        virtual ~InterpolacionAproximacion();
        void leer();
        void escogerDatosInter(char literal);
        void ordenarDatosAInterpolar();
        void calcularOtroPolinomio();//Calcula el polinomio con el cual se comparará la aprximación(Lagrange o Newton)
        void calcularSumatorias();
        void escribirMatrizA(); // Método para calcular la matriz A de sumatorias, del sistema Ax=b
        void escribirVectorB();
        void calcularPolyAprox();
        void evaluarDatos();
        void escribirResultado1(); //Escribe archivo de texto para resultados del primer punto
        void escribirResultado2();
        void inicializarDatosAleatorios();
        void calcularErrorAprox();
        void calcularBondadAprox();
        void determinarPolinomioAprox();
        void setGradoPolyAprox(int gradoNuevo);
        long double getBondad();
        Polinomio getPolinomioAprox();
        long double getErrorAprox();

};

#endif	/* INTERPOLACIONAPROXIMACION_H */

